package org.shock.ss.sms.commons.dao;

import java.util.List;
import java.util.Map;

import org.shock.ss.sms.bean.Pager;

/**
 * 基础dao接口，定义常用数据库的操作方法，大部分Dao接口仅需要继承该接口即可
 * 
 * @author 季乐
 */
public abstract interface BaseDao<T> {
	/**
	 * 增加操作
	 * 
	 * @param bean
	 * @throws Exception
	 */
	public abstract void add(T bean) throws Exception;

	/**
	 * 增加后返回bean对象
	 * 
	 * @param bean
	 * @return bean
	 * @throws Exception
	 */
	public abstract T addBean(T bean) throws Exception;

	/**
	 * 通过sql语句，删除操作，可做复杂条件下的删除
	 * 
	 * @param sql
	 * @throws Exception
	 */
	public abstract void del(String sql) throws Exception;

	/**
	 * 删除单个bean对象
	 * 
	 * @param bean
	 * @throws Exception
	 */
	public abstract void del(T bean) throws Exception;

	/**
	 * 修改操作
	 * 
	 * @param bean
	 * @throws Exception
	 */
	public abstract void update(T bean) throws Exception;

	/**
	 * 根据sql语句查询所有对象列表无分页
	 * 
	 * @param sql
	 * @return
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	public abstract List listAll(String sql) throws Exception;

	/**
	 * 分页列表
	 * 
	 * @param dir
	 *            升序降序
	 * @param sort
	 *            排序字段
	 * @param pageno
	 *            当前页码
	 * @param rownum
	 *            每页显示行数
	 * @param sqlCount
	 *            计算总数的sql语句
	 * @param sql
	 *            查询sql语句
	 * @return 一个Pager对象封装了List和总数
	 * @throws Exception
	 */
	public abstract Pager list(String dir, String sort, int pageno, int rownum, String sqlCount, String sql)
			throws Exception;

	/**
	 * 查询单条记录
	 * 
	 * @param sql
	 * @return 一个map，不是具体某个对象，为的是多表查询返回的不仅仅显示一个对象所具有的属性
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	public abstract Map view(String sql) throws Exception;

	/**
	 * 通过id获得一个bean对象
	 * 
	 * @param id
	 * @return bean对象
	 * @throws Exception
	 */
	public abstract T get(Long id) throws Exception;

	/**
	 * 批量增加bean对象，可用于导入操作
	 * 
	 * @param beanList
	 * @return 增加的总数
	 * @throws Exception
	 */
	public abstract Integer addBatch(List<T> beanList) throws Exception;

	/**
	 * 执行一条sql语句，该方法不必要存在，为了方便暂时保留
	 * 
	 * @param sql
	 * @return 执行是否成功
	 * @throws Exception
	 */
	public boolean doSql(String sql) throws Exception;

}
